package com.geo.geoProject.client.application;

import com.geo.geoProject.client.UI.docks.Docks;
import com.geo.geoProject.client.UI.docks.Icone;
import com.geo.geoProject.client.UI.fenetres.EvenementsTitreFenetre;
import com.geo.geoProject.client.UI.fenetres.FenetreApplication;
import com.geo.geoProject.client.donneesStatiques.ApplicationGestion;
import com.google.gwt.user.client.ui.Widget;
import com.smartgwt.client.widgets.events.MovedEvent;
import com.smartgwt.client.widgets.events.MovedHandler;
import com.smartgwt.client.widgets.events.ResizedEvent;
import com.smartgwt.client.widgets.events.ResizedHandler;

public abstract class Programme implements EvenementsTitreFenetre { 
	
	private boolean minimisee = true ;
	
	public class ConfigurationFenetre {
		public boolean ShowFooter = false ;
	}
	
	private Icone  icone   ;;
	private FenetreApplication fenetrePrincipale = null ;
	private Widget contenu ;
	
	// ajoute une icone et prepare le programme
	public Programme() {
		init() ;
	}
	
	public void init() {
		contenu = getInitWidget() ;
		if (contenu!=null) {
			ConfigurationFenetre c = getConfigurationApparance() ;
			fenetrePrincipale = new FenetreApplication(contenu, getTitreApplication(), ApplicationGestion.get().canvasGlobal, c) ;
			fenetrePrincipale.setListener(this) ; 
		}
		icone = getIcone() ;
		if (icone!=null) {
			Docks.addProgramme(icone, this) ;
		} else {
			Docks.addProgramme(new Icone("cube_blue.png"), this) ;
		}
		
		fenetrePrincipale.addResizedHandler(new ResizedHandler() {
			public void onResized(ResizedEvent event) {
				resizeAppWindow(fenetrePrincipale.getWidth(), fenetrePrincipale.getHeight()) ;
			}
		}) ;
		
		fenetrePrincipale.addMovedHandler(new MovedHandler() {
			public void onMoved(MovedEvent event) {
				if (fenetrePrincipale.getTop()<10) {
					fenetrePrincipale.setTop("10px") ;
				} else {
					moved(fenetrePrincipale.getTop(), fenetrePrincipale.getLeft()) ;
				}
			}
		}) ;
	}

	
	public abstract void moved(int top, int left) ;

	// (protected) : methode uniquement accessible depuis les classes filles.
	protected void envoiMessage(MessageInterProgramme m) {
		m.idSender = getPid() ;
		IPCMessage.get().transmettre(m) ;
	}
	protected void envoiMessage(Object o, int idMsgType, ListeDesApplications idReceiver) {
		MessageInterProgramme m = new MessageInterProgramme() ;
		m.idSender    = getPid()         ;
		m.idRreceiver = idReceiver ;
		m.idMsgType   = idMsgType  ;
		m.o           = o          ;
		IPCMessage.get().transmettre(m) ;
	}

	public abstract ListeDesApplications getPid() ;

	public void setVisible(boolean b) { 
		fenetrePrincipale.setVisible(b) ; 
	}
 
	public abstract String getTitreApplication() ;
	public abstract Widget getInitWidget() ; // le contenu
	public abstract Icone  getIcone() ; // l'icone (null = defaut)
	public abstract ConfigurationFenetre getConfigurationApparance() ; // configuration de l'apparance
	public abstract void resizeAppWindow(int w, int h) ; // la fenetre change de taille
	public abstract void recoitMessage(MessageInterProgramme m) ; // reception d'un message
	public abstract void minimise() ; // que faire lorsque la fenetre est minimisee
	public abstract void maximise() ; // que faire lorsque la fenetre est maximisee

	public void clickIcone() {
		if (minimisee) {
			fenetrePrincipale.setVisible(true) ;
			minimisee = false ;
			maximise() ;
		} else {
			fenetrePrincipale.setVisible(false) ;
			minimisee = true ;
			minimise() ;
		}
	} 

	@Override
	public void clickMinimiser() {
		minimise() ;
		fenetrePrincipale.setVisible(false) ;
		minimisee = true ;
	}

}
